package com.twq.collection.list.firstorder

/**
 * Created by tangweiqun on 2017/12/10.
 */
object Second {
  def main(args: Array[String]): Unit = {
    //1、Prefixes and suffixes: drop, take, and splitAt
    //xs take n 表示获取list的前n个元素，如果n大于xs.length的话，则返回整个list
    //xs drop n 表示获取除了list的前n个元素的剩下的所有元素，如果n大于xs.length的话，则返回空的list
    //xs splitAt n 表示在指定的下标n下将list切断为2个子list，其实等于(xs take n, xs drop n)
    val abcde = List('a', 'b', 'c', 'd', 'e')
    abcde take 2
    abcde drop 2
    abcde splitAt 2

    //2、Element selection: apply and indices
    //apply 是对list随机访问的方法，这个方法是很好使用的，因为对一个list进行随机访问是一个比较耗时的操作
    //因为list是一个链式的结构，所以随机访问的时候，你需要遍历list，随着遍历的元素个数越大，时间越长
    abcde apply 2 //在scala中是不经常用的
    abcde(2) //上面的方法的简洁写法，在scala中是不经常用的

    abcde.indices //返回list的所有的下标

    //3、Flattening a list of lists: flatten
    //将一个List类型的list打平
    List(List(1, 2), List(3), List(), List(4, 5)).flatten
    val xs = List(Set(1, 2, 3), Set(1, 2, 3)).flatten
    //List(1, 2, 3).flatten //将会报错

    //4、Zipping lists: zip and unzip
    //zip是将两个list合并为一个二元组类型的list
    abcde.indices zip abcde
    val zipped = abcde zip List(1, 2, 3) //如果两个list的场部不一样的话，那么没有配对的元素会被删除掉

    abcde.zipWithIndex //返回二元组类型的list，其中二元组中的第二个元素是list中的元素，而第一个元素是第二个元素在list中的位置

    zipped.unzip //将二元组类型的list转成两个list

  }
}
